﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TCC_Hotel.Repositorio;
using TCC_Hotel.Entidades;
using System.Web.Caching;

namespace TCC_Hotel.Serviços.BDServices
{
    public class ProdutoService
    {
        ProdutoRepositorio repositorio = new ProdutoRepositorio();

        /// <summary>
        /// Serviço para inserir um produto no banco
        /// </summary>
        /// <param name="funcionario">Produto que será inserido</param>
        /// <returns>True se foi inserido ou false se nao</returns>
        public bool CadastrarProduto(Produto produto)
        {
            return repositorio.CadastrarProduto(produto);

        }

        /// <summary>
        /// Serviço para listar todos os Produtos do banco
        /// </summary>
        /// <returns>Lista com os Produtos do banco</returns>
        public List<Produto> RecuperarProdutos()
        {
            return repositorio.RecuperarProdutos().OrderBy(i => i.NomeProduto).ToList();

        }

        /// <summary>
        /// Serviço para excluir um produto no banco
        /// </summary>
        /// <param name="funcionario">Nome do produto que será excluído</param>
        /// <returns>True se foi excluido ou false se nao</returns>
        public bool ExcluirProduto(int ID)
        {
            return repositorio.ExcluirProduto(ID);

        }
        
         /// <summary>
        /// Serviço para listar os detalhes de um produto do banco 
        /// </summary>
        /// <returns>produto especifico do banco</returns>
        public Produto RecuperarDetalhesProduto(int ID)
        {
            return repositorio.RecuperarDetalhesProduto(ID);

        }
        
        
        /// <summary>
        /// Serviço para editar um produto do banco 
        /// </summary>
        /// <returns>true se editou e false se nao</returns>
        public bool EditarProduto(int ID, Produto produto)
        {
            return repositorio.EditarProduto(ID, produto);
        }        
        
        /// <summary>
        /// Verifica se a informação ja esta gravada em cache, se tiver recupera, 
        /// senao faz a consulta e grava em cache
        /// </summary>
        /// <returns>Lista de Produtos</returns>
        public List<Produto> ListarProdutosCache()
        {
            List<Produto> produtos = new List<Produto>();

            //Verifica se a informação esta guardada em cache
            if (HttpContext.Current.Cache.Get("Lista_Produtos") == null)
            {
                //Consulta os Produtos no banco
                produtos = RecuperarProdutos();

                //Armazena a lista de Produtos em cache de 1 minuto para evitar muitas consultas ao banco
                HttpContext.Current.Cache.Add("Lista_Produtos", produtos, null,
                                 DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, CacheItemPriority.High, null);

            }

           //caso essa informaçao ja estiver no cache
            else
            {
                //Resgata informação do cache
                produtos = (List<Produto>)HttpContext.Current.Cache.Get("Lista_Produtos");

            }

            return produtos;

        }

    }
}